package crontab

import (
	"errors"
	"github.com/robfig/cron/v3"
)

const (
	Every1s = "@every 1s"
	Every5s = "@every 5s"
	Every1m = "@every 1m"
	Every1h = "@every 1h"

	//### 预定义时间规则
	//
	//为了方便使用，`cron`预定义了一些时间规则：
	//
	//- `@yearly`：也可以写作`@annually`，表示每年第一天的 0 点。等价于`0 0 1 1 *`；
	//- `@monthly`：表示每月第一天的 0 点。等价于`0 0 1 * *`；
	//- `@weekly`：表示每周第一天的 0 点，注意第一天为周日，即周六结束，周日开始的那个 0 点。等价于`0 0 * * 0`；
	//- `@daily`：也可以写作`@midnight`，表示每天 0 点。等价于`0 0 * * *`；
	//- `@hourly`：表示每小时的开始。等价于`0 * * * *`。

)

// StartMoreCronV3 启动多个定时任务
func StartMoreCronV3(cronMap map[string]func()) (map[cron.EntryID]error,
	error) {
	c := cron.New()
	errMap := map[cron.EntryID]error{}
	for cronExp, cronFun := range cronMap {
		id, err := c.AddFunc(cronExp, cronFun)
		if err != nil {
			errMap[id] = err
			continue
		}
	}
	c.Start()
	if len(errMap) == 0 {
		return nil, nil
	}
	return errMap, errors.New("some cron err")
}

func StartCronV3(cronExp string, cronFun func()) error {
	c := cron.New()
	// 1、调用cron对象的AddFunc()方法向管理器中添加定时任务。
	// AddFunc()接受两个参数，参数 1 以字符串形式指定触发时间规则，参数 2 是一个无参的函数，每次触发时调用。
	// @every 1s表示每秒触发一次，@every后加一个时间间隔，表示每隔多长时间触发一次。
	_, err := c.AddFunc(cronExp, cronFun)
	if err != nil {
		return err
	}
	c.Start()
	return nil
}

func StartCronJobV3(cronExp string, job Job) error {
	c := cron.New()
	// 2、除了直接将无参函数作为回调外，cron还支持Job接口：
	_, err := c.AddJob(cronExp, job)
	if err != nil {
		return err
	} // 调用cron对象的AddJob()方法将GreetingJob对象添加到定时管理器中
	// 调用c.Start()启动定时循环。
	c.Start()
	return nil
}

// Job 接口
type Job interface {
	Run()
}
